package com.xy.ddd.core.service;

import com.xy.ddd.core.mapper.criteria.LogicCriteria;
import com.xy.ddd.core.model.DomainModel;
import com.xy.ddd.core.model.PageData;
import org.springframework.util.CollectionUtils;

import java.util.List;

/**
 * 领域服务
 * @param <D>
 * @author rcx
 */
public interface IDomainService<D extends DomainModel> {

    default  D findOneByField(String fieldName, Object fieldValue) {
        List<D> list = findListByField(fieldName, fieldValue);
        return CollectionUtils.isEmpty(list) ? null : list.get(0);
    }

    List<D> findListByField(String fieldName, Object fieldValue);

    D findById(long id);

    List<D> find(LogicCriteria criteria);

    /**
     * 分页查询
     * @return
     */
    PageData<D> page(LogicCriteria criteria, long currentPage, int size);

    long saveOrUpdate(D record);

    boolean batchSave(List<D> list);

    /**
     * 根据主键更新属性不为null的值
     * @param record
     * @return
     */
    long update(D record);

    /**
     * 根据Example条件更新实体`record`包含的全部属性，null值会被更新
     *
     * @param record
     * @param example
     * @return
     */
    int updateByExample(D record, LogicCriteria example);

    boolean batchUpdate(List<D> list);

    boolean delete(long id);

    /**
     * 根据实体属性作为条件进行删除，查询条件使用等号
     *
     * @param record
     * @return
     */
    int delete(D record);

    /**
     * 根据Example条件删除数据
     *
     * @param example
     * @return
     */
    int deleteByExample(LogicCriteria example);


}
